Git基础指令
Git基础指令
Cathelloya以下内容来自Learn Git Branching
0.常用小指令
粘贴代码到git,shift+insert
1.Git主要命令
提交分支
1 | git commit |
新建分支
1 | git branch bugFix |
切换到该分支
1 | git checkout bugFix |
合并分支
1.如果你基于主分支master新建了分支dev,再基于dev分支新建了一个分支test,在test分支开发完成后,需要将test合并到dev分支上。此时,先用git branch 查看自己在哪个分支上,然后git checkout dev(切换到需要合并的分支上),最后git merge test(在dev分支上执行这句,意思是将test合并到dev分支上)
首先checkout到main上,然后再1
git merge bugFix
2.在bugFix分支上使用1
git rebase main
项目更加线性
2.分离HEAD
在 main 的基础上继续1
git checkout C4
相对引用
- 使用
^
向上移动 1 个提交记录 - 使用
~<num>
向上移动多个提交记录,如~3
以下代码将HEAD移动到指定的位置1
git checkout bugFix^
1 | git checkout bugFix~1 |
以下代码将指定的brach移动到指定的位置
我使用相对引用最多的就是移动分支。可以直接使用 -f
选项让分支指向另一个提交。例如:
git branch -f main HEAD~3
上面的命令会将 main 分支强制指向 HEAD 的第 3 级 parent 提交。
撤销变更
主要有两种方法用来撤销变更 —— 一是 git reset
,还有就是 git revert
。
要完成此关,分别撤销 local
分支和 pushed
分支上的最近一次提交。共需要撤销两个提交(每个分支一个)。
记住 pushed
是远程分支,local
是本地分支 —— 这么说你应该知道用分别哪种方法了吧?
对于本地的撤销1
git reset HEAD~1
对于远程的撤销1
get revert HEAD~1
3.自由修改提交树
整理提交记录
从HEAD指向的地方增加C2’ C3’ C4’1
git cherry-pick C2 C3 C4
交互式的rebase
1 | git rebase -i HEAD~4 |
本地栈式提交
….
提交的技巧
我们可以通过下面的方法来克服困难:
- 先用
git rebase -i
将提交重新排序,然后把我们想要修改的提交记录挪到最前 - 然后用
git commit --amend
来进行一些小修改 - 接着再用
git rebase -i
来将他们调回原来的顺序 - 最后我们把 main 移到修改的最前端(用你自己喜欢的方法),就大功告成啦!
当然完成这个任务的方法不止上面提到的一种(我知道你在看 cherry-pick 啦),之后我们会多点关注这些技巧啦,但现在暂时只专注上面这种方法。 最后有必要说明一下目标状态中的那几个'
—— 我们把这个提交移动了两次,每移动一次会产生一个 '
;而 C2 上多出来的那个是我们在使用了 amend 参数提交时产生的,所以最终结果就是这样了。
也就是说,我在对比结果的时候只会对比提交树的结构,对于 '
的数量上的不同,并不纳入对比范围内。只要你的 main
分支结构与目标结构相同,我就算你通过。
git tag
给c1打上v1的标签1
git tag v1 c1
git describe
git describe
的语法是:
git describe <ref>
<ref>
可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会使用你目前所在的位置(HEAD
)。
它输出的结果是这样的:
<tag>_<numCommits>_g<hash>
tag
表示的是离 ref
最近的标签, numCommits
是表示这个 ref
与 tag
相差有多少个提交记录, hash
表示的是你所给定的 ref
所表示的提交记录哈希值的前几位。
当 ref
提交记录上有某个标签时,则只输出标签名称
4.多次rebase的用法
1 | git rebase master bugFix |
返回上个时遇到两个父节点
HEAD~首先回到上一层
^2 会优先选择较新的节点
^ 会优先选择较早的节点1
git branch bugWork HEAD~^2~
5.远程仓库
克隆代码
1 | git clone |
远程分支
1 | git commit |
一键下载
1 | git fetch |
git pull
以下两种方式是等价的1
git pull
1 | git fetch |
模拟团队合作
1 | git clone |
git push一键上传
1 | git push |
偏离的提交历史
1 | git clone |
远程服务器拒绝!(Remote Rejected)
如果你是在一个大的合作团队中工作, 很可能是main被锁定了, 需要一些Pull Request流程来合并修改。如果你直接提交(commit)到本地main, 然后试图推送(push)修改, 你将会收到这样类似的信息:
1 | ! [远程服务器拒绝] main -> main (TF402455: 不允许推送(push)这个分支; 你必须使用pull request来更新这个分支.) |
1 | git reset o/main |
6.关于origin和它的周边
推送主分支 rebase
1 | git fetch |
推送主分支 merge
1 | git checkout master |
远程跟踪,创建一个名为foo的分支跟踪o/main
1 | git checkout -b foo o/main |
另一种设置远程追踪分支的方法就是使用:git branch -u
命令,执行:git branch -u o/main foo
这样 foo
就会跟踪 o/main
了。如果当前就在 foo 分支上, 还可以省略 foo:git branch -u o/main
这边的git pull —rebase会产生c3’,git pull会产生c41
2
3
4git checkout -b side o/master / git branch -f side master
git commit
git pull --rebase
git push
git更新指定仓库
用本地的分支main更新远程仓库origin中的分支main1
git push origin main
要同时为源和目的地指定 <place>
的话,只需要用冒号 :
将二者连起来就可以了:git push origin <source>:<destination>
这个参数实际的值是个 refspec,“refspec” 是一个自造的词,意思是 Git 能识别的位置(比如分支 foo
或者 HEAD~1
)
一旦你指定了独立的来源和目的地,就可以组织出言简意赅的远程操作命令了,让我们看看演示!
1 | git push origin master |
git pull参数
1 | git pull origin bar:foo |